// 观察者模式 <====> 发布订阅模式
class PubSub {
    constructor() {
        // 一个对象存放所有的消息订阅 
        // 每一个消息对应一个数组 数组结构如下：
        // {
        //        "event1": [cb1,cb2]
        // }
        this.events = {};
    }

    subscribe(event,callback) {
        if(this.events[event]) {
            // 如果有人订阅过了 这个键已经存在 就往里面加就好了
            this.events[event].push(callback);
        }else {
            // 没人订阅过 就建一个数组 回调放进去
            this.events[event] = [callback];
        }
    }

    publish(event,...args) {
        // 取出所有订阅者的回调执行
        const subscribedEvents = this.events[event];

        if(subscribedEvents && subscribedEvents.length) {
            subscribedEvents.forEach(callback => {
                callback.call(this,...args);
            })
        }
    }

    unsubscribe(event,callback) {
        // 删除某个订阅 保留其他的订阅
        const subscribedEvents = this.events[event];
        if(subscribedEvents && subscribedEvents.length) {
            this.events[event] = this.events[event].filter(cb => cb !== callback)
        }
    }
}
// 使用的时候
const pubSub = new PubSub();
pubSub.subscribe('event1',()=>{})    // 注册事件
pubSub.publish('event1');    //发布事件